Specific Factors
What are the factors that cause software to become unmanageable?
Luckily, the same factors are at play in other systems besides software. This allows us to develop a more comprehensive understanding of the problem, as well as adapt solutions from these other systems.
What other systems show this type of progression toward unmanageability? Consider these examples:
- Government
- Legal System
- Tax Code
- Large Companies
What do these have in common? First, they are all large. Second, they all have a lot of complexity. So, we can conclude that Size and Complexity are major factors. But, more interestingly, why? Why do these systems have a lot of complexity, and what do we mean by "large"?
Size
What is size? For our purposes, we will define size as:
Size = The number of entities comprising a system.
Complexity
What is complexity? The meaning tends to be a bit fuzzy:
- "Hard to understand"
- "Has a lot of parts"
- "Unpredictable"
In order to make headway, we need to do better than this. Here is a much more useful definition of complexity:
Complexity = The number of dependencies within a system.
This immediately explains why larger systems would tend to be more complex: Larger systems have the potential for more dependencies.
This also explains why older systems tend to be more complex: Older systems have had more time to accumulate both entities and dependencies.
So, it stands to reason: systems that are both old and large would tend to be the most complex - which takes us back to our original list:
- Government
- Legal System
- Tax Code
- Large Companies
All of these are both large and old, host a lot of dependencies - and are therefore complex.
Note: A benefit of these definitions for Size and Complexity is that they are suitable for mathematical treatment and analysis. Later, we will use this to examine the relationship between complexity and various methodologies for addressing it.
Software
How does this relate to software?
It turns out that software is the perfect environment to host complexity, because:
- It is easy to create entities (get large)
- It is easy to create dependencies between entities
- Because the above is so easy, software ages rapidly, in other words "changes per day" is highly accelerated with software and related systems, effectively "accelerating time" for software-based systems.
Interestingly, complexity is both the "Fuel" and the "Fire", which is why actions taken to fix "out of control systems" often have the opposite effect.
Next
This understanding of complexity points the way toward specific methodologies we can use to control it.
In following posts we will discuss these methodologies and ways to implement them incrementally and in a non-disruptive fashion.